package projetoeCommerce.Dados;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

import projetoeCommerce.Entidades.ItenVenda;
import projetoeCommerce.Entidades.Venda;


public class DadosVendas {
	
	public int Inserir(Venda v) throws SQLException
	{
		Connection conexao = Conexao.GetConexao();
		int codigoVenda = 0;
		
		try {

			Statement stm = conexao.createStatement();

			StringBuilder sb = new StringBuilder("Insert into Venda " +
					"(Data, CodUsuario, CodCliente, FormaDePagamento, MeioDeVenda)");
			
			sb.append("values (");
			sb.append("'" + v.getDataSqlFormatted() + "', ");
			sb.append("'" + v.getUsuario().get_codigo() + "', ");
			sb.append("'" + v.getCliente().get_codigo() + "', ");
			sb.append("'" + v.FormaPagamento + "', ");
			sb.append("'" + v.MeioDeVenda + "' ");			
			sb.append(") select scope_identity()");
			
			System.out.println(sb.toString());
			codigoVenda = stm.executeUpdate(sb.toString());
			
			ResultSet rs = stm.getGeneratedKeys();
			rs.next();
			
			codigoVenda = rs.getInt(1);
			
			this.InserirItens(v.Itens.values(), codigoVenda);
		}
		finally
		{
			conexao.close();
		}
		
		return codigoVenda;
	}
	
	private void InserirItens(Collection<ItenVenda> itens, int codigoVenda) throws SQLException
	{
		
		System.out.println("Entrou em inserir itens");
		System.out.println("Quantidade de intes: " + itens.size());
		
		Iterator it = itens.iterator();
		
		
		while(it.hasNext())
		{
			System.out.println("Entrou em um item do iterator");
			ItenVenda iten = (ItenVenda) it.next();
			iten.setCodigoVenda(codigoVenda);
			
			System.out.println("Chamou inserir iten");
			InserirIten(iten);
		}		
	}
	
	private void InserirIten(ItenVenda iten) throws SQLException {
		Connection conexao = Conexao.GetConexao();
		
		try {

			Statement stm = conexao.createStatement();

			StringBuilder sb = new StringBuilder("Insert into ItensVenda " +
					"(CodVenda, CodProd, Quantidade)");
			
			sb.append("values (");
			sb.append("'" + iten.getCodigoVenda() + "', ");
			sb.append("'" + iten.getProduto().get_codigo() + "', ");
			sb.append("'" + iten.quantidadeVenda + "' ");
			sb.append(") ");
			
			System.out.println(sb.toString());
			stm.execute(sb.toString());
						
		}
		finally
		{
			conexao.close();
		}
		
	}

	public HashMap<String, Venda> getTodos() throws SQLException{

		HashMap<String, Venda> vendas = new HashMap<String, Venda>();

		Connection conexao = Conexao.GetConexao();
		try {

			Statement stm = conexao.createStatement();

			StringBuilder sb = new StringBuilder("Select * from Venda ");
		
			System.out.println(sb.toString());
			ResultSet rs = stm.executeQuery(sb.toString());

			while (rs.next()) {
				Venda v = ControiVendaComRS(rs);
				vendas.put(v.getCodigo() + "", v);
			}

			rs.close();
			stm.close();

		}
		finally
		{
			conexao.close();
		}

		return vendas;	
	}

	private Venda ControiVendaComRS(ResultSet rs) throws SQLException {
		Venda v = new Venda();
		  
		  v.setCodigo(rs.getInt("CodVenda")); 
		  v.setData(rs.getDate("Data"));
		  
		  // obtem o objeto usuario
		  v.setUsuario(new DadosUsuario().GetPorCodigo(rs.getInt("CodUsuario")));
		  
		  // obtem o objeto cliente
		  v.setCliente(new DadosCliente().GetPorCodigo(rs.getInt("CodCliente")));
		  
		  
		  
		  v.FormaPagamento = rs.getString("FormaDePagamento"); 
		  v.MeioDeVenda = rs.getString("MeioDeVenda");
		
		  return v;
	}
	
}
